import os

'''
路径可以是绝对或者相对路径,支持通过..到上一级
'''
from not_so_free_marker import statics, file_helper
from not_so_free_marker.models import RegMatchInclude
from not_so_free_marker.enums import FileOpResultEnum


def process(template_folder_path: str, template: str):
    include_list = []
    for m in statics.regInclude.finditer(template): # 用正则查找所有<include>标记
        rmatch = RegMatchInclude()
        rmatch.position = m.start(0)
        rmatch.position_end = m.end(0)
        rmatch.tagStr = m.group(0)
        rmatch.file_path = os.path.join(template_folder_path, m.group(1))
        include_list.append(rmatch)

    if len(include_list) < 1:
        return template

    processed_array = []  # 合并之后的文本列表.模拟StringBuilder的机制,入队列,输出的时候join

    end_index = 0  # 游标.上一个匹配项的结尾.对于刚开始,上一个匹配的结尾就是整个模板的开头,也就是0
    for m in include_list:
        processed_array.append(template[end_index:m.position])  # 粘贴上一个匹配到下一个匹配中间的部分.
        open_result, content = file_helper.read_file(m.file_path)  # 读取文件
        if open_result == FileOpResultEnum.FILE_NOT_FOUND:
            content = "#####文件{0}没有找到#####".format(m.file_path)
        processed_array.append(content)  # 粘贴引入文件的内容
        end_index = m.position_end  # 更新游标

    processed_array.append(template[end_index:])  # 粘贴最后一个匹配至模板的结尾.

    return "".join(processed_array)
